238. 除自身以外数组的乘积

238. 除自身以外数组的乘积

Similar Question

Solution Tips

方案: 前缀和 + 后缀和

前缀和后缀和要根据题意初始化, 不能太死板了, 这里其实是不包含 i 自身的, 搞得边界情况最后自己都弄不懂了

/**
 * @param {number[]} nums
 * @return {number[]}
 */
var productExceptSelf = function(nums) {

    // 同时使用前缀和与后缀和 answer[i] = sums[i] + sums[i+2]
    // 同时预留两边的边界, 所以是 + 2
    // const sums = new Array(nums.length+2).fill(0)
    // for (let i = 0; i < nums.length; i++) {
    //     sums[i + 1] = sums[i] + sums[i + 2]
    // }
    const res = [];
    const sufSums = new Array(nums.length + 1).fill(1)
    for (let i = nums.length - 1; i >= 0; i--) {
        const num = nums[i];
        sufSums[i] = sufSums[i + 1] * num
        // 本来以为减少一次n会快一点, 结果反而更慢了
        // 可能是因为 unshift 太慢了
        // res.unshift(preSums[i] * sufSums[i + 1])
    }

    // 没有办法一次遍历计算出前后缀, 分开来就好了
    const preSums = new Array(nums.length + 1).fill(1)
    for (let i = 0; i < nums.length; i++) {
        const num = nums[i];
        preSums[i+1] = preSums[i] * num
        res.push(preSums[i] * sufSums[i+1])
    }


    // 计算 answer 数组
    // const res = [];
    // for (let i = 0; i < nums.length; i++) {
    //     res.push(preSums[i] * sufSums[i + 1])
    // }
    return res;
};

console.log(productExceptSelf([1,2,3,4]))

优化空间复杂度: answer 直接使用 presum 已经创建好的数组, sufSum 也不用创建了, 直接乘算就行